// using UnityEngine;
// using GGameFramework.Core.FSM;
//
// namespace GGameFramework.Examples.FSM
// {
//     /// <summary>
//     /// 玩家下落状态
//     /// </summary>
//     public class PlayerFallState : FsmState<PlayerController>
//     {
//         private const string KEY_IS_GROUNDED = "IsGrounded";
//         private const string KEY_ATTACK_INPUT = "AttackInput";
//         
//         private float m_FallStartTime;
//         private Vector3 m_FallVelocity;
//         private bool m_LandingEffectPlayed = false;
//         
//         protected internal override void OnInit(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("下落状态初始化");
//         }
//         
//         protected internal override void OnEnter(IFsm<PlayerController> fsm)
//         {
//             PlayerController player = fsm.Owner;
//             m_FallStartTime = 0f;
//             m_LandingEffectPlayed = false;
//             
//             // 设置下落动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsFalling", true);
//                 player.GetAnimator().SetBool("IsJumping", false);
//                 player.GetAnimator().SetBool("IsMoving", false);
//                 player.GetAnimator().SetTrigger("FallStart");
//             }
//             
//             // 播放下落音效
//             // player.PlaySound(fallSound);
//             
//             Debug.Log("进入下落状态");
//         }
//         
//         protected internal override void OnUpdate(IFsm<PlayerController> fsm, float elapseSeconds, float realElapseSeconds)
//         {
//             PlayerController player = fsm.Owner;
//             CharacterController characterController = player.GetCharacterController();
//             m_FallStartTime += elapseSeconds;
//             
//             // 检查攻击输入（空中攻击）
//             bool attackInput = fsm.GetData<BoolVariable>(KEY_ATTACK_INPUT)?.Value ?? false;
//             if (attackInput && player.CanAttack())
//             {
//                 ChangeState<PlayerAttackState>(fsm);
//                 return;
//             }
//             
//             // 更新下落物理
//             UpdateFallPhysics(player, characterController, elapseSeconds);
//             
//             // 检查是否落地
//             bool isGrounded = characterController.isGrounded;
//             fsm.SetData("IsGrounded", new BoolVariable(isGrounded));
//             
//             if (isGrounded && m_FallStartTime > 0.1f)
//             {
//                 // 落地，播放落地效果
//                 if (!m_LandingEffectPlayed)
//                 {
//                     PlayLandingEffect(player);
//                     m_LandingEffectPlayed = true;
//                 }
//                 
//                 // 检查下落高度，决定是否受伤
//                 if (m_FallStartTime > 2.0f) // 下落时间超过2秒，可能受伤
//                 {
//                     // 计算下落伤害
//                     int fallDamage = CalculateFallDamage(m_FallStartTime);
//                     if (fallDamage > 0)
//                     {
//                         player.TakeDamage(fallDamage);
//                         Debug.Log($"下落受伤: {fallDamage}");
//                     }
//                 }
//                 
//                 // 切换到空闲状态
//                 ChangeState<PlayerIdleState>(fsm);
//                 return;
//             }
//             
//             // 检查生命值状态
//             int currentHealth = fsm.GetData<IntVariable>("Health")?.Value ?? 100;
//             if (currentHealth <= 0)
//             {
//                 ChangeState<PlayerDeathState>(fsm);
//                 return;
//             }
//         }
//         
//         protected internal override void OnLeave(IFsm<PlayerController> fsm, bool isShutdown)
//         {
//             PlayerController player = fsm.Owner;
//             
//             // 停止下落动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsFalling", false);
//             }
//             
//             Debug.Log("离开下落状态");
//         }
//         
//         protected internal override void OnDestroy(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("下落状态销毁");
//         }
//         
//         /// <summary>
//         /// 更新下落物理
//         /// </summary>
//         private void UpdateFallPhysics(PlayerController player, CharacterController characterController, float deltaTime)
//         {
//             if (characterController == null) return;
//             
//             // 应用重力
//             float gravity = player.GetGravity();
//             m_FallVelocity.y += gravity * deltaTime;
//             
//             // 限制最大下落速度
//             float maxFallSpeed = -30f;
//             m_FallVelocity.y = Mathf.Max(m_FallVelocity.y, maxFallSpeed);
//             
//             // 应用移动（空中控制）
//             Vector3 moveInput = fsm.GetData<Vector3Variable>("MoveInput")?.Value ?? Vector3.zero;
//             if (moveInput.magnitude > 0.1f)
//             {
//                 float moveSpeed = player.GetMoveSpeed() * 0.3f; // 下落时移动速度大幅减少
//                 Vector3 horizontalMovement = moveInput.normalized * moveSpeed * deltaTime;
//                 m_FallVelocity.x = horizontalMovement.x;
//                 m_FallVelocity.z = horizontalMovement.z;
//             }
//             
//             // 执行移动
//             characterController.Move(m_FallVelocity * deltaTime);
//         }
//         
//         /// <summary>
//         /// 播放落地效果
//         /// </summary>
//         private void PlayLandingEffect(PlayerController player)
//         {
//             // 播放落地音效
//             // player.PlaySound(landingSound);
//             
//             // 播放落地动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetTrigger("Landing");
//             }
//             
//             // 播放落地粒子效果
//             // PlayLandingParticles(player.transform.position);
//             
//             // 屏幕震动效果
//             // CameraShake.Instance.Shake(0.1f, 0.1f);
//         }
//         
//         /// <summary>
//         /// 计算下落伤害
//         /// </summary>
//         private int CalculateFallDamage(float fallTime)
//         {
//             // 简单的下落伤害计算
//             if (fallTime < 1.5f) return 0; // 安全下落
//             if (fallTime < 2.5f) return 5;  // 轻微受伤
//             if (fallTime < 3.5f) return 15; // 中度受伤
//             return 30; // 严重受伤
//         }
//         
//         public override string GetStateName()
//         {
//             return "下落状态";
//         }
//         
//         public override bool CanTransitionTo<TState>(IFsm<PlayerController> fsm)
//         {
//             // 下落状态可以转换到大部分状态
//             return true;
//         }
//     }
// }
